// 当表单提交时触发事件监听器
document.getElementById('generatorForm').addEventListener('submit', function (e) {
  // 阻止表单默认提交行为
  e.preventDefault();

  // 获取用户输入的数量、最小长度和最大长度，并转换为整数
  let quantity = parseInt(document.getElementById('quantity').value);
  let minLength = parseInt(document.getElementById('minLength').value);
  let maxLength = parseInt(document.getElementById('maxLength').value);

  // 初始化一个数组用于存储选择的字符集
  let charsets = [];
  // 如果用户选择了数字，则将数字字符集添加到数组中
  if (document.getElementById('numbers').checked) {
    charsets.push('0123456789');
  }
  // 如果用户选择了小写字母，则将小写字母字符集添加到数组中
  if (document.getElementById('lowercase').checked) {
    charsets.push('abcdefghjkmnopqrstuvwxyz');
  }
  // 如果用户选择了大写字母，则将大写字母字符集添加到数组中
  if (document.getElementById('uppercase').checked) {
    charsets.push('ABCDEFGHJKLMNPQRSTUVWXYZ');
  }
  // 如果用户选择了符号，则将符号字符集添加到数组中
  if (document.getElementById('symbols').checked) {
    charsets.push('~!@#$%^&*()_+');
  }

  // 检查是否有字符集被选择并且最小长度是否小于字符集数量
  if (charsets.length > 0 && minLength < charsets.length) {
    // 如果最小长度小于字符集数量，则提示错误信息并返回
    alert("最小长度必须至少等于所选字符集的数量");
    return;
  }

  // 初始化结果字符串
  let result = '';
  // 根据用户指定的数量生成随机字符串
  for (let i = 0; i < quantity; i++) {
    // 在最小长度和最大长度之间随机选择一个长度
    let length = Math.floor(Math.random() * (maxLength - minLength + 1)) + minLength;
    // 调用函数生成指定长度的随机字符串
    let randomString = generateRandomString(length, charsets);
    // 将生成的随机字符串添加到结果字符串中
    result += randomString + '\n';
  }

  // 将最终的结果字符串显示在页面上
  document.getElementById('result').innerText = result;
});

// 定义生成随机字符串的函数
function generateRandomString(length, charsets) {
  let result = '';

  // 确保每个字符集中至少有一个字符被包含在生成的字符串中
  for (let i = 0; i < charsets.length; i++) {
    result += charsets[i].charAt(Math.floor(Math.random() * charsets[i].length));
  }

  // 将所有字符集合并成一个大的字符集
  let combinedCharset = charsets.join('');
  // 继续添加字符直到达到所需的长度
  for (let i = charsets.length; i < length; i++) {
    result += combinedCharset.charAt(Math.floor(Math.random() * combinedCharset.length));
  }

  // 打乱字符串中的字符顺序以增加随机性
  result = shuffleString(result);

  // 返回生成的随机字符串
  return result;
}

// 定义打乱字符串中字符顺序的函数
function shuffleString(str) {
  // 将字符串转换为数组
  let array = str.split('');
  // 使用Fisher-Yates洗牌算法打乱数组元素的顺序
  for (let i = array.length - 1; i > 0; i--) {
    let j = Math.floor(Math.random() * (i + 1));
    let temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }
  // 将数组重新组合成字符串并返回
  return array.join('');
}